#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

// 定义返回结果的结构体
typedef struct{
  char *p;
  int length;
} Result; 

void *thread_run(void *);

int main(void){
  pthread_t threa1;
  pthread_t threa2;
  char str1='a'; // 发数据给线程1的数据标识
  char str2='b'; // 发数据给线程2的数据标识
  Result *thread1Result=NULL; // 保存线程1的执行返回结果
  Result *thread2Result=NULL; // 保存线程2的执行返回结果
  // 创建两个线程,共用一个线程执行函数
  pthread_create(&threa1,NULL,thread_run,&str1);
  pthread_create(&threa2,NULL,thread_run,&str2);
  // 分别执行并获取两个线程的结果
  pthread_join(threa1,(void **)&thread1Result);
  pthread_join(threa2,(void **)&thread2Result);

  // 打印获取到的结果
  printf("线程1的执行结果:%s\n",thread1Result->p);
  printf("线程2的执行结果:%s\n",thread2Result->p);

  // 释放内存
  free(thread1Result->p);
  free(thread2Result->p);
  free(thread1Result);
  free(thread2Result);
  printf("主线程清理完毕子线程创建的动态内存空间，程序退出\n");
  return 0;
}

void *thread_run(void *argv){
  // 获取主线程传入的参数标识
  char c =  *((char *)argv);
  char *str = malloc(100); // 保存要返回给主函数的业务数据
  // 线程返回的结构体指针
  Result *result = malloc(sizeof(Result));
  while(1){ // 一直监控来自控制台的输入，直到获取到自己的数据
    fgets(str,100,stdin);  
    // 判断消息是不是发给自己的
    if(str[0]==c){
      printf("线程%zu收到了消息:%s\n",pthread_self(),str);
      // 清空str,然后准备返回消息
      memset(str,0,100);
      sprintf(str, "哈罗,我是线程%zu,我收到了你的消息了",pthread_self());
      // 准备回复数据
      result->p=str;
      result->length=strlen(str);
      // 线程正常结束，返回数据
      //pthread_exit(result); // 自动装箱操作，result转 void *
      pthread_exit((void *)result); // 手动装箱操作
    }else{
      printf("线程%zu还没收到消息，继续等待\n",pthread_self());
    }  
  }
}
